home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- MODULE: _rbget.h
- PURPOSE: recio character delimited integral number input functions
- COPYRIGHT: (C) 1994 William Pierpoint
- VERSION: 2.00
- RELEASE: April 15, 1994
- *****************************************************************************/
-
- #ifndef _RBGET_H
- #define _RBGET_H
-
- #include "recio.h"
-
- extern int _rstatus(REC *rp, int mode);
- extern char *_rfldstr(REC *rp, size_t len);
- extern char *_rerrs(REC *rp, int errnum);
-
- #define READ 0
-
- /* clip value v between lower l and upper u bounds */
- #define range(l, v, u) (min(max((l),(v)),(u)))
-
- /* macro to get character delimited integral number */
- #define rbget_fn( /* define function to get number from record */\
- fn_type, /* defined function return type */\
- fn_name, /* defined function name */\
- fn_err, /* defined function error return value */\
- cv_type, /* conversion function return type */\
- cv_name, /* conversion function name */\
- fn_min, /* inclusive valid minimum value */\
- fn_max) /* inclusive valid maximum value */\
- \
- fn_type fn_name( /* return fn_type, return fn_err on error */\
- REC *rp, /* record pointer */\
- int base) /* radix of number */\
- { \
- fn_type result=(fn_err); /* result to return */\
- cv_type val; /* conversion value */\
- char *fldptr; /* pointer to field string */\
- char *endptr; /* pointer to first invalid field char */\
- \
- if (!_rstatus(rp, READ)) { \
- fldptr = _rfldstr(rp, 0); \
- if (fldptr) { \
- for (;;) { \
- if (*fldptr != '\0') { \
- endptr = fldptr; \
- val = cv_name(fldptr, &endptr, base); \
- while (isspace(*endptr)) endptr++; \
- if (errno==ERANGE || !*endptr) { \
- if (!errno) { \
- if (val>=(fn_min) && val<=(fn_max)) { \
- result = (fn_type) val; \
- goto done; \
- } \
- } /* out of range */ \
- fldptr = _rerrs(rp, R_ERANGE); \
- if (fldptr) { continue; } else { goto done; } \
- } /* invalid data */ \
- fldptr = _rerrs(rp, R_EINVDAT); \
- if (fldptr) { continue; } else { goto done; } \
- } /* missing data (empty fldstr) */ \
- fldptr = _rerrs(rp, R_EMISDAT); \
- if (fldptr) { continue; } else { goto done; } \
- } \
- } /* null pointer */ \
- } \
- done: \
- return result; \
- }
-
- #endif
-